package dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.sql.PreparedStatement;

import modele.Personne;

public class PersonneDAO implements IDAO<Personne> {

	static Connection connection = null;
	static Statement stmt = null;
	static final String SQL_INSERER_PERSONNE = "INSERT INTO personne (id_personne, nom, prenom, date_naissance, telephone, adresse, code_postal, ville, email, password) VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
	static final String SQL_MODIFIER_PERSONNE = "UPDATE  personne SET  nom = ?,prenom = ?,date_naissance = ?,telephone = ?,adresse = ?,code_postal = ?,ville = ?,email = ?,password = ? WHERE  personne.id_personne = ?";
	static final String SQL_SUPPRIMER_PAR_ID = "DELETE FROM personne WHERE personne.id_personne = ?";
	static final String SQL_CHERCHER_PAR_ID = "SELECT * FROM personne WHERE personne.id_personne = ?";
	static final String SQL_LISTER_PERSONNE = "SELECT * FROM personne";
	private static final String ID_PERSONNE = "id_personne";
	private static final String NOM = "nom";
	private static final String PRENOM = "prenom";
	private static final String DATE_NAISSANCE = "date_naissance";
	private static final String TELEPHONE = "telephone";
	private static final String ADRESSE = "adresse";
	private static final String CODE_POSTAL = "code_postal";
	private static final String VILLE = "ville";
	private static final String EMAIL = "email";
	private static final String PASSWORD = "password";

	public PersonneDAO() throws SQLException {
		/**
		 * on essaie de se connecter à la base de données, message d'erreur si
		 * ça ne fonctionne pas : Problème de connection à la base
		 */
		connection = FabriqueDAO.getConnection();
		stmt = connection.createStatement();
	}

	public void inserer(Personne p) throws SQLException {
		inserer(p, connection);
	}

	/**
	 * Créer une nouvelle personne dans la base de données, avec une connexion
	 * donnée
	 * 
	 * @param p
	 */
	public void inserer(Personne p, Connection conn) throws SQLException {
		PreparedStatement pt = conn.prepareStatement(SQL_INSERER_PERSONNE,
				Statement.RETURN_GENERATED_KEYS);
		pt.setString(1, p.getNom());
		pt.setString(2, p.getPrenom());
		pt.setDate(3, p.getDate_naissance());
		pt.setString(4, p.getTelephone());
		pt.setString(5, p.getAdresse());
		pt.setString(6, p.getCode_postal());
		pt.setString(7, p.getVille());
		pt.setString(8, p.getEmail());
		pt.setString(9, p.getPassword());
		pt.executeUpdate();
		ResultSet rs = pt.getGeneratedKeys();
		if (rs.next()) {
			p.setIdPersonne(rs.getInt(1));
		}
	}

	/**
	 * méthode pour chercher les informations d'une personne selon son id
	 * 
	 * @param id
	 * @return personne
	 */

	public Personne lireParId(int id) throws SQLException {
		Personne result = null;
		PreparedStatement pt = connection.prepareStatement(SQL_CHERCHER_PAR_ID);
		pt.setInt(1, id);
		ResultSet rs = pt.executeQuery();
		if (rs.next()) {
			result = rowToBean(rs);
		}
		return result;
	}

	public void modifier(Personne p) throws SQLException {
		modifier(p, connection);
	}

	/**
	 * méthode pour modifier une personne de la base de données, avec une
	 * connexion donnée
	 * 
	 * @param personne
	 */
	public void modifier(Personne p, Connection conn) throws SQLException {
		PreparedStatement pt = connection
				.prepareStatement(SQL_MODIFIER_PERSONNE);
		pt.setString(1, p.getNom());
		pt.setString(2, p.getPrenom());
		pt.setDate(3, p.getDate_naissance());
		pt.setString(4, p.getTelephone());
		pt.setString(5, p.getAdresse());
		pt.setString(6, p.getCode_postal());
		pt.setString(7, p.getVille());
		pt.setString(8, p.getEmail());
		pt.setString(9, p.getPassword());
		pt.setInt(10, p.getIdPersonne());
		pt.executeUpdate();
	}

	public void supprimer(int id) throws SQLException {
		supprimer(id, connection);
	}

	/**
	 * Supprimer une personne de la base de données selon son id, avec une
	 * connexion donnée
	 * 
	 * @param id
	 */
	public void supprimer(int id, Connection conn) throws SQLException {
		PreparedStatement pt = connection
				.prepareStatement(SQL_SUPPRIMER_PAR_ID);
		pt.setInt(1, id);
		pt.executeUpdate();
	}

	/**
	 * méthode pour lister toutes les personnes de la table Personne
	 * 
	 * @return tableauPersonne
	 */
	public List<Personne> lister() throws SQLException {
		ArrayList<Personne> tableauPersonne = new ArrayList<>();
		PreparedStatement pt = connection.prepareStatement(SQL_LISTER_PERSONNE);
		ResultSet rs = pt.executeQuery();
		while (rs.next()) {
			tableauPersonne.add(rowToBean(rs));
		}
		return tableauPersonne;
	}

	/** Renvoie null si pas trouvé */
	public Personne lireParLoginPassword(String login, String password)
			throws SQLException {
		Personne result = null;
		String sql = "SELECT * FROM personne WHERE email=? AND password=?";
		PreparedStatement ps = connection.prepareStatement(sql);
		ps.setString(1, login);
		ps.setString(2, password);
		ResultSet rs = ps.executeQuery();
		if (rs.next()) {
			result = rowToBean(rs);
		}
		return result;
	}

	/** Produit une personne à partir d'une ligne complète de la BD */
	protected Personne rowToBean(ResultSet rs) throws SQLException {
		int id = rs.getInt(ID_PERSONNE);
		String nom = rs.getString(NOM);
		String prenom = rs.getString(PRENOM);
		Date date_naissance = rs.getDate(DATE_NAISSANCE);
		String telephone = rs.getString(TELEPHONE);
		String adresse = rs.getString(ADRESSE);
		String code_postal = rs.getString(CODE_POSTAL);
		String ville = rs.getString(VILLE);
		String email = rs.getString(EMAIL);
		String password = rs.getString(PASSWORD);
		return new Personne(id, nom, prenom, date_naissance, telephone,
				adresse, code_postal, ville, email, password);
	}
}